﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLMuestraEspecial
    {
        #region Metodos
        /// <summary>
        /// Método devuelve lista MuestraEspecial
        /// </summary>
        /// <returns></returns>
        public List<MuestraEspecial> ListarMuestraEspecial()
        {
            return Accesor.ListarMuestraEspecial();
        }

        /// <summary>
        /// Método devuelve lista MuestraEspecial por codigo
        /// </summary>
        /// <returns></returns>
        public List<buscarMuestraEspecial_Result> BuscarMuestraEspecialPorcodigo(DateTime fechaInicio, DateTime fechaFinal, int codigoCategoria, int estado)
        {
            return Accesor.BuscarMuestraEspecialPorcodigo(fechaInicio, fechaFinal, codigoCategoria, estado).ToList();
        }

        /// <summary>
        /// Método inserta una MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        /// <returns></returns>
        public string InsertarMuestraEspecial(MuestraEspecial muestraEspecial)
        {
            string result = "Registrado";

            using (TransactionScope transaction = new TransactionScope())
            {

                Accesor.InsertarMuestraEspecial(muestraEspecial);

                //Actualizar Estado de Codigo de Muestra como 2=Asociado
                DACodigoMuestra dacodigoMuestra = new DACodigoMuestra();
                var codigoMuestra = dacodigoMuestra.ObtenerCodigoMuestra(muestraEspecial.CodigoMuestraEspecial);
                if (codigoMuestra != null)
                {
                    codigoMuestra.CodigoEstado = 2; //ASOCIADO

                    dacodigoMuestra.ModificarCodigoMuestra(codigoMuestra);
                }

                transaction.Complete();
                return result;
            }
        }
        /// <summary>
        /// Método modifica una MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        public string ModificarMuestraEspecial(MuestraEspecial muestraEspecial)
        {
            string result = "Registrado";
            var muestraEspecialEdit = Accesor.ObtenerMuestraEspecial(muestraEspecial.CodigoMuestraEspecial);

            if (muestraEspecialEdit != null)
            {
                muestraEspecialEdit.CodigoGeologo = muestraEspecial.CodigoGeologo;
                muestraEspecialEdit.CodigoTomadorMuestra = muestraEspecial.CodigoTomadorMuestra;
                muestraEspecialEdit.Fecha = muestraEspecial.Fecha;
                muestraEspecialEdit.NumeroViajes = muestraEspecial.NumeroViajes;
                muestraEspecialEdit.CodigoTipoMaterialMuestra = muestraEspecial.CodigoTipoMaterialMuestra;
                muestraEspecialEdit.CodigoPlataforma = muestraEspecial.CodigoPlataforma;
                muestraEspecialEdit.Observacion = muestraEspecial.Observacion;
                muestraEspecialEdit.CodigoTipoControlCalidad = muestraEspecial.CodigoTipoControlCalidad;
                muestraEspecialEdit.CodigoMuestraEspecialDuplicado = muestraEspecial.CodigoMuestraEspecialDuplicado;

                //Particular
                muestraEspecialEdit.CodigoLabor = muestraEspecial.CodigoLabor;

                Accesor.ModificarMuestraEspecial(muestraEspecialEdit);
            }
            return result;
        }
        /// <summary>
        /// Método modifica una MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        public string ModificarMuestraCancha(MuestraEspecial muestraEspecial)
        {
            string result = "Registrado";
            var muestraEspecialEdit = Accesor.ObtenerMuestraEspecial(muestraEspecial.CodigoMuestraEspecial);

            if (muestraEspecialEdit != null)
            {
                muestraEspecialEdit.CodigoGeologo = muestraEspecial.CodigoGeologo;
                muestraEspecialEdit.CodigoTomadorMuestra = muestraEspecial.CodigoTomadorMuestra;
                muestraEspecialEdit.Fecha = muestraEspecial.Fecha;
                muestraEspecialEdit.NumeroViajes = muestraEspecial.NumeroViajes;
                muestraEspecialEdit.CodigoTipoMaterialMuestra = muestraEspecial.CodigoTipoMaterialMuestra;
                muestraEspecialEdit.CodigoPlataforma = muestraEspecial.CodigoPlataforma;
                muestraEspecialEdit.Observacion = muestraEspecial.Observacion;
                muestraEspecialEdit.CodigoTipoControlCalidad = muestraEspecial.CodigoTipoControlCalidad;
                muestraEspecialEdit.CodigoMuestraEspecialDuplicado = muestraEspecial.CodigoMuestraEspecialDuplicado;

                //Particular
                muestraEspecialEdit.CodigoTipoCancha = muestraEspecial.CodigoTipoCancha;

                Accesor.ModificarMuestraEspecial(muestraEspecialEdit);
            }
            return result;
        }
        /// <summary>
        /// Método modifica una MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        public string ModificarMuestraPlanta(MuestraEspecial muestraEspecial)
        {
            string result = "Registrado";
            var muestraEspecialEdit = Accesor.ObtenerMuestraEspecial(muestraEspecial.CodigoMuestraEspecial);

            if (muestraEspecialEdit != null)
            {
                muestraEspecialEdit.CodigoGeologo = muestraEspecial.CodigoGeologo;
                muestraEspecialEdit.CodigoTomadorMuestra = muestraEspecial.CodigoTomadorMuestra;
                muestraEspecialEdit.Fecha = muestraEspecial.Fecha;
                muestraEspecialEdit.NumeroViajes = muestraEspecial.NumeroViajes;
                muestraEspecialEdit.CodigoTipoMaterialMuestra = muestraEspecial.CodigoTipoMaterialMuestra;
                muestraEspecialEdit.CodigoPlataforma = muestraEspecial.CodigoPlataforma;
                muestraEspecialEdit.Observacion = muestraEspecial.Observacion;
                muestraEspecialEdit.CodigoTipoControlCalidad = muestraEspecial.CodigoTipoControlCalidad;
                muestraEspecialEdit.CodigoMuestraEspecialDuplicado = muestraEspecial.CodigoMuestraEspecialDuplicado;

                //Particular
                muestraEspecialEdit.HoraIni = muestraEspecial.HoraIni;
                muestraEspecialEdit.HoraFin = muestraEspecial.HoraFin;

                Accesor.ModificarMuestraEspecial(muestraEspecialEdit);
            }
            return result;
        }
        /// <summary>
        /// Método modifica una MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        public string ModificarMuestraHumanidades(MuestraEspecial muestraEspecial)
        {
            string result = "Registrado";
            var muestraEspecialEdit = Accesor.ObtenerMuestraEspecial(muestraEspecial.CodigoMuestraEspecial);

            if (muestraEspecialEdit != null)
            {
                muestraEspecialEdit.CodigoGeologo = muestraEspecial.CodigoGeologo;
                muestraEspecialEdit.CodigoTomadorMuestra = muestraEspecial.CodigoTomadorMuestra;
                muestraEspecialEdit.Fecha = muestraEspecial.Fecha;
                muestraEspecialEdit.NumeroViajes = muestraEspecial.NumeroViajes;
                muestraEspecialEdit.CodigoTipoMaterialMuestra = muestraEspecial.CodigoTipoMaterialMuestra;
                muestraEspecialEdit.CodigoPlataforma = muestraEspecial.CodigoPlataforma;
                muestraEspecialEdit.Observacion = muestraEspecial.Observacion;
                muestraEspecialEdit.CodigoTipoControlCalidad = muestraEspecial.CodigoTipoControlCalidad;
                muestraEspecialEdit.CodigoMuestraEspecialDuplicado = muestraEspecial.CodigoMuestraEspecialDuplicado;

                //Particular

                Accesor.ModificarMuestraEspecial(muestraEspecialEdit);
            }
            return result;
        }
        /// <summary>
        /// Método que elimina MuestraEspecial
        /// </summary>
        /// <param name="MuestraEspecial"></param>
        public void EliminarMuestraEspecial(string codigoMuestraEspecial)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                var muestraEspecial = Accesor.ObtenerMuestraEspecial(codigoMuestraEspecial);
                Accesor.EliminarMuestraEspecial(muestraEspecial);

                //Actualizar Estado de Codigo de Muestra como 1=GENERADO
                DACodigoMuestra dacodigoMuestra = new DACodigoMuestra();
                var codigoMuestra = dacodigoMuestra.ObtenerCodigoMuestra(muestraEspecial.CodigoMuestraEspecial);
                if (codigoMuestra != null)
                {
                    codigoMuestra.CodigoEstado = 1; //GENERADO
                    dacodigoMuestra.ModificarCodigoMuestra(codigoMuestra);
                }

                transaction.Complete();
            }
        }
        /// <summary>
        /// Método obtener muestra mensaje por codigo
        /// </summary>
        /// <param name="codigoMuestraMensaje"></param>
        /// <returns></returns>
        public MuestraEspecial ObtenerMuestraEspecial(string codigoMuestraEspecial)
        {
            var muestraEspecial = Accesor.ObtenerMuestraEspecial(codigoMuestraEspecial);
            if (muestraEspecial.CodigoLabor != null)
                muestraEspecial.Labor = new DALabor().Obtener((int)muestraEspecial.CodigoLabor);

            return muestraEspecial;
        }

        /// <summary>
        /// Devuelve la lista de Muestra Especial
        /// </summary>
        /// <param name="codigoGrupoMezcla"></param>
        /// <returns></returns>
        public List<listarBlendingMuestra_Result> BuscarMuestraEspecialPorCodigoGrupoMezcla(string codigoGrupoMezcla)
        {
            return Accesor.BuscarMuestraEspecialPorCodigoGrupoMezcla(codigoGrupoMezcla);
        }

        /// <summary>
        /// Devuelve la lista de Muestra Especial por Tipo de Cancha
        /// </summary>
        /// <param name="codigoTipoCancha"></param>
        /// <param name="codigoGrupoMezcla"></param>
        /// <returns></returns>
        public List<buscarMuestraEspecialPorTipoCancha_Result> BuscarMuestraEspecialPorTipoCancha(int codigoTipoCancha, string codigoMuestraEspecial)
        {
            return Accesor.BuscarMuestraEspecialPorTipoCancha(codigoTipoCancha, codigoMuestraEspecial);
        }
        #endregion

        /// <summary>
        /// Lista Muestra Especial por categoria
        /// </summary>
        /// <param name="codigoCategoria"></param>
        /// <returns></returns>
        public List<MuestraEspecial> ListarPlataformaPorCategoria(short codigoCategoria)
        {
            return Accesor.ListarMuestraEspecialPorCategoria(codigoCategoria);
        }
        /// <summary>
        /// Lista cargar dropdown o listbox por categoria muestra especial
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem(int codigoCategoria)
        {

            var result = Accesor.ListarMuestraEspecialPorCategoria(codigoCategoria);
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestraEspecial, Text = x.CodigoMuestraEspecial }).ToList();

        }

        /// <summary>
        /// Obtiene el último código de muestra generado
        /// </summary>
        /// <param name="codigoCategoriaMuestraEspecial"></param>
        /// <returns></returns>
        public string ObtenerUltimoCodigoMuestraEspercial(int codigoCategoriaMuestraEspecial)
        {
            return Accesor.ObtenerUltimoCodigoMuestraEspercial(codigoCategoriaMuestraEspecial);
        }
        #region Accesor
        private static DAMuestraEspecial Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAMuestraEspecial(); }
        }
        #endregion
    }
}
